// 扩展运算符,对应用类型的内容复制了一份,缺点只能实现第一层，多层的话是浅拷贝
// 浅拷贝（有关联）深拷贝（无关联）
// var arr = [1, 2, 3]
// let arr1 = [...arr]
// arr1[0] = 5
// console.log(arr);
// console.log(arr1);
// // JSON.parse（JSON.stringfy（））只能拷贝属性不能拷贝函数function
// var obj = {
//     name: 'sd',
//     add() {
//         console.log('das');
//     }
// }
// let obj1 = JSON.parse(JSON.stringify(obj))
// console.log(obj);
// console.log(obj1);

// 递归函数实现
var origin = {
    name: 'sd',
    add() {
        console.log('das');
    },
    arr: [[1, 2], 3]
}
// 定义递归函数
// function exten(origin, deep) {
//     let obj = {}
//     if (origin instanceof Array) {
//         obj = []
//     }
//     for (let key in origin) {
//         let value = origin[key]
//         obj[key] = (!!deep && typeof value === 'object' && value != null) ? exten(value, deep) : value
//     }
//     return obj
// }
// const oo = exten(origin, true)
// oo.arr[0].push(888)
// console.log(oo);
// console.log(origin);
// 定义递归函数升级版
function deepClone(origin) {
    // 创建一个空的目标对象，根据原始对象的类型选择创建数组或对象
    const targetObj = origin.constructor === Array ? [] : {};

    // 遍历原始对象的属性
    for (let key in origin) {
        // 检查属性是否是原始对象的自有属性
        if (origin.hasOwnProperty(key)) {
            // 检查属性值是否是对象类型
            if (origin[key] && typeof origin[key] === 'object') {
                // 如果是对象类型，创建对应的目标对象的属性，并递归调用 deepClone 函数进行深拷贝
                targetObj[key] = origin.constructor === Array ? [] : {};
                targetObj[key] = deepClone(origin[key]);
            } else { 
                // 如果不是对象类型，直接赋值给目标对象的属性
                targetObj[key] = origin[key];
            }
        }
    }
    // 返回深拷贝后的目标对象
    return targetObj;
}
let neworigin=deepClone(origin)
neworigin.name='dadasda'
console.log(origin,neworigin);